package com.shop.shopmall.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.shop.shopmall.pojo.MenuRole;
import com.shop.shopmall.pojo.Role;
import com.shop.shopmall.service.MenuRoleService;
import com.shop.shopmall.service.RoleService;
import com.shop.shopmall.vo.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;


/**
 * 角色管理控制器
 */
@RestController
@RequestMapping("/role")
public class RoleController {

    @Autowired
    RoleService roleService;

    @Autowired
    MenuRoleService menuRoleService;

    /**
     * 获取所有角色列表
     */
    @GetMapping("/getAllRoles")
    public Result<?> getAllRole() {
        List<Role> roles = roleService.getAllRoles();
        return Result.success(roles);
    }

    /**
     * 根据角色 ID 获取该角色所拥有的菜单 ID 列表
     */
    @GetMapping("/getRoleMenus/{id}")
    public Result<?> getMenuByRoleId(@PathVariable int id) {
        Integer[] menus = roleService.getMenuByRoleId(id);
        return Result.success(menus);
    }

    /**
     * 根据查询条件分页获取角色列表
     *
     * @param role      前端传入的角色查询条件
     * @param pageSize  每页条数
     * @param pageNum   当前页码
     */
    @PostMapping("/{pageSize}/{pageNum}")
    public Result<?> getRole(@RequestBody Role role,
                             @PathVariable Integer pageSize,
                             @PathVariable Integer pageNum) {
        List<Role> roles = roleService.getRole(role, pageSize, pageNum);
        return Result.success(roles);
    }

    /**
     * 根据角色 ID 获取角色信息
     */
    @GetMapping("/{id}")
    public Result<?> getRoleById(@PathVariable int id) {
        Role role = roleService.getById(id);
        return Result.success(role);
    }

    /**
     * 新增角色，并绑定角色与菜单的关系
     */
    @Transactional
    @PostMapping("/add")
    public Result<?> add(@RequestBody Role role) {
        // 保存角色信息（主键生成后会自动回填到 role 对象的 id 字段）
        roleService.save(role);
        // 新增角色与菜单的关联关系
        List<MenuRole> list = new ArrayList<>();
        for (Integer mid : role.getMenus()) {
            MenuRole menuRole = new MenuRole();
            menuRole.setRid(role.getId());
            menuRole.setMid(mid);
            list.add(menuRole);
        }
        menuRoleService.saveBatch(list);
        return Result.success();
    }

    /**
     * 更新角色信息及角色菜单关系
     */
    @Transactional
    @PutMapping("/{id}")
    public Result<?> update(@PathVariable int id, @RequestBody Role role) {
        // 先更新角色基本信息（id 通过路径变量传入）
        role.setId(id);
        roleService.updateById(role);
        // 删除原有的角色菜单关系
        LambdaQueryWrapper<MenuRole> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(MenuRole::getRid, id);
        menuRoleService.remove(queryWrapper);
        // 重新添加角色菜单关系
        List<MenuRole> list = new ArrayList<>();
        for (Integer mid : role.getMenus()) {
            MenuRole menuRole = new MenuRole();
            menuRole.setRid(id);
            menuRole.setMid(mid);
            list.add(menuRole);
        }
        menuRoleService.saveBatch(list);
        return Result.success();
    }

    /**
     * 根据角色 ID 删除角色，并同步删除角色菜单关系
     */
    @Transactional
    @DeleteMapping("/{id}")
    public Result<?> delete(@PathVariable int id) {
        // 删除角色信息
        roleService.removeById(id);
        // 删除角色与菜单的关联关系
        LambdaQueryWrapper<MenuRole> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(MenuRole::getRid, id);
        menuRoleService.remove(queryWrapper);
        return Result.success();
    }
}
